﻿Imports System.ComponentModel
Imports System.Runtime.CompilerServices

Public Class Service

	Class Combo

		Shared Function Statuler() As List(Of SourceItem)
			Dim List As New List(Of SourceItem)
			For Each Item In StatuListesi.Values
				List.Add(New SourceItem(Item.Kod, Item.Ad))
			Next
			Return List
		End Function

		Shared Function Cinsiyetler() As List(Of SourceItem)
			Dim List As New List(Of SourceItem)
			List.Add(New SourceItem("E", "Erkek"))
			List.Add(New SourceItem("K", "Kadın"))
			Return List
		End Function

		Shared Function Aylar() As List(Of SourceItem)
			Dim List As New List(Of SourceItem)
			Dim Rs = OpenSQL("select distinct convert(char(6),tarih1,112) from hareket where tarih1 is not null order by 1 desc")
			Do Until Rs.EOF
				List.Add(New SourceItem(Rs(0), Mid(Rs(0), 1, 4) & "/" & Mid(Rs(0), 5, 2)))
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Function AltBirimler(ByVal Birim As Integer) As List(Of SourceItem)
			Dim List As New List(Of SourceItem)
			Dim Rs = OpenSQL("select kod,adi from altbirim where birim = @d", Birim)
			Do Until Rs.EOF
				List.Add(New SourceItem(Rs("kod"), Rs("adi")))
				Rs.MoveNext()
			Loop
			Return List
		End Function

	End Class

	Class Personel

		Shared Function Liste(ByVal Birim As Integer) As List(Of SourceItem)
			Dim List As New List(Of SourceItem)
			Dim Rs = OpenSQL("select kod, adi, soyadi from personel where birim = " & If(Birim = 0, "birim", Birim) & " order by adi,soyadi")
			Do Until Rs.EOF
				List.Add(New SourceItem(Rs("kod"), ToTitle(Rs("adi") & " " & Rs("soyadi"))))
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Function DetayliListe(ByVal Birim As Integer) As List(Of PersonelInfo)
			Dim List As New List(Of PersonelInfo)
			Q("select p.kod,p.adi,p.soyadi,p.cinsiyet,p.kimlik,isnull(d.adi,'') as birim,isnull(b.adi,'') as altbirim,")
			Q("isnull((select top 1 statu from hareket where personel = p.kod and statu is not null order by tarih1 desc),'') as statu,")
			Q("case when exists(select * from hareket where personel = p.kod) then 1 else 0 end as info")
			Q("from personel p inner join birim d on p.birim = d.kod left join altbirim b on p.birim = b.birim and p.altbirim = b.kod")
			Q("where @dpt in (0,p.birim) and isnull(p.durum,'') = '' order by p.adi,p.soyadi")
			Dim Rs As Recordset = OpenSQL("*", Birim)
			Do Until Rs.EOF
				List.Add(New PersonelInfo With {.Kod = Rs("kod"), .Kimlik = Rs("kimlik"),
				  .Adi = Rs("adi"), .Soyadi = Rs("soyadi"), .AdiSoyadi = ToTitle(Rs("adi") & " " & Rs("soyadi")),
				  .Cinsiyet = Rs("cinsiyet"), .Birim = Rs("birim"), .AltBirim = Rs("altbirim"), .Statu = Rs("statu"), .HasInfo = Rs("info") = 1})
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Function Oku(ByVal Kod As Integer) As PersonelInfo
			Dim Rs As Recordset = OpenSQL("select * from personel where kod = @kod", Kod)
			Dim Personel As New PersonelInfo With {.Kod = Rs("kod"), .Kimlik = Rs("kimlik"),
			  .Adi = Rs("adi"), .Soyadi = Rs("soyadi"), .AdiSoyadi = ToTitle(Rs("adi") & " " & Rs("soyadi")),
			  .Cinsiyet = Rs("cinsiyet"), .Birim = IsNull(Rs("birim")), .AltBirim = IsNull(Rs("altbirim"))}
			Rs = OpenSQL("select * from hareket where personel = @kod and tur = '*'", Kod)
			If Not Rs.EOF Then
				Personel.IlkHareket = True
				Personel.IlkYil = Year(Rs("tarih1"))
				Personel.IlkStatu = Rs("statu")
				Personel.IlkIzin = Rs("izin")
				Personel.IlkGun = Rs("gun")
				Personel.IlkSaat = Rs("saat")
				Personel.IseBasTar = Rs("tarih1")
			End If
			Rs = OpenSQL("select tarih1,statu from hareket where personel = @kod and tur = 'T' order by tarih1", Kod)
			Personel.Statuler = ""
			Do Until Rs.EOF
				Personel.Statuler &= "|" & CDate(Rs("tarih1")).DateStr & "," & Rs("statu") & "," & StatuListesi(Rs("statu")).Ad
				Rs.MoveNext()
			Loop
			Personel.Statuler = Mid(Personel.Statuler, 2)
			Personel.Devir = Val(Personel.IlkIzin) > "0" Or Val(Personel.IlkGun) > "0" Or (Personel.IseBasTar.Day + Personel.IseBasTar.Month) = 2
			Return Personel
		End Function

		Shared Function Kaydet(ByVal Kod As Integer, ByVal Ad As String, ByVal Soyad As String, ByVal Cinsiyet As String, ByVal Kimlik As String,
		  ByVal Birim As Integer, ByVal AltBirim As Integer,
		  ByVal Devir As Boolean, Yil As String, IseBasTar As Date, ByVal Statu As String, ByVal Izin As Decimal,
		  ByVal GunBakiyesi As Decimal, ByVal Saat As Decimal, ByVal Statuler As String, ByVal Kullanici As Integer) As String
			Try
				ExecSQL("begin tran")
				Dim Rs As Recordset = OpenSQL("select * from personel where kod = @kod", Kod)
				If Rs.EOF Then Rs.AddNew()
				Rs.SetValues("adi,soyadi,cinsiyet,kimlik,birim,altbirim", Ad.ToLower, Soyad.ToLower, Cinsiyet, Kimlik, Birim, AltBirim)
				Rs.Save()
				If Kod = 0 Then Kod = OpenSQL("select max(kod) from personel")(0)
				'If Izin > 0 Or GunBakiyesi > 0 Then
				ExecSQL("delete from hareket where personel = @kod and tur = '*'", Kod)
				ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,statu,izin,gun,saat) values (@personel,'*',@tarih1,@tarih2,@statu,@izin,@gun,@saat)",
				 Kod, If(Devir, Yil & "0101", IseBasTar), DBNull.Value, Statu, Izin, GunBakiyesi, Saat)
				'End If
				ExecSQL("delete from hareket where personel = @kod and tur = 'T'", Kod)
				If Statuler <> "" Then
					For Each Item In Statuler.Split("|")
						Dim Data = Item.Split(",")
						ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,statu) values (@personel,'T',@tarih1,@tarih2,@statu)", Kod, Data(0), Data(0), Data(1))
					Next
				End If
				Log("personel", Kod, Kullanici)
				ExecSQL("commit tran")
				Return ""
			Catch ex As Exception
				ExecSQL("rollback tran")
				Return ex.Message
			End Try
		End Function

		Shared Sub Sil(ByVal Kod As Integer, ByVal Kullanici As String)
			Try
				ExecSQL("begin tran")
				ExecSQL("update personel set durum = 'x' where kod = @kod", Kod)
				Log("personel", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
			End Try
		End Sub

	End Class

	Shared Sub Log(ByVal Tablo As String, ByVal Kod As Integer, ByVal Kullanici As Integer)
		If NoLog() Then Exit Sub
		ExecSQL("insert into log (tablo,tkod,tarih,kullanici) values (@tablo,@tkod,convert(smalldatetime,getdate()),@kullanici)", Tablo, Kod, Kullanici)
	End Sub

	Shared Function Tatil(ByVal d As Date)
		Static Rs As Recordset = Nothing
		If Rs Is Nothing Then Rs = OpenSQL("select * from tatil")
		If (From r As DataRow In Rs.Rows Where r("tur") = 1 Let t = CDate(r("tarih")) Where t.Month * 100 + t.Day = d.Month * 100 + d.Day).Any Then Return True
		If (From r As DataRow In Rs.Rows Where r("tur") = 2 Let t = CDate(r("tarih")) Where DateDiff(DateInterval.DayOfYear, t, d) Mod r("data") = 0).Any Then Return True
		If (From r As DataRow In Rs.Rows Where r("tur") = 3 Let t = CDate(r("tarih")) Let f = DateDiff(DateInterval.DayOfYear, t, d) Where f >= 0 And f < r("data")).Any Then Return True
		Return False
	End Function

	Class Talep

		Shared Sub Kaydet(ByVal Personel As Integer, ByVal Tarih1 As Date, ByVal Tarih2 As Date, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				ExecSQL("insert into basvuru (personel,tarih1,tarih2,durum) values (@personel,@tarih1,@tarih2,@durum)", Personel, Tarih1, Tarih2, "0")
				Dim Kod = OpenSQL("select @@identity")(0)
				Log("basvuru", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Function Talepler(ByVal Personel As Integer) As List(Of TalepBilgisi)
			Dim List As New List(Of TalepBilgisi)
			Dim Rs = OpenSQL("select * from basvuru where personel = @personel and durum in ('0','1') order by tarih1", Personel)
			Do Until Rs.EOF
				List.Add(New TalepBilgisi With {.Kod = Rs("kod"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .Durum = Rs("durum")})
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Function OnayBekleyen(ByVal Birim As Integer) As List(Of TalepBilgisi)
			Dim List As New List(Of TalepBilgisi)
			Dim Rs = OpenSQL("select a.* from basvuru a inner join personel b on a.personel = b.kod where @birim in (0, b.birim) and a.durum = 0 order by tarih1", Birim)
			Do Until Rs.EOF
				List.Add(New TalepBilgisi With {.Kod = Rs("kod"), .personel = Rs("personel"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .Durum = Rs("durum")})
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Function Onaylanan(ByVal Birim As Integer) As List(Of TalepBilgisi)
			Dim List As New List(Of TalepBilgisi)
			Dim Rs = OpenSQL("select a.* from basvuru a inner join personel b on a.personel = b.kod where @birim in (0, b.birim) and a.durum = 1 order by tarih1", Birim)
			Do Until Rs.EOF
				List.Add(New TalepBilgisi With {.Kod = Rs("kod"), .personel = Rs("personel"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .Durum = Rs("durum")})
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Sub IptalEt(ByVal Personel As Integer, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				Dim Kod = OpenSQL("select * from basvuru where durum = '0' and personel = @personel", Personel)(0)
				ExecSQL("delete from basvuru where kod = @kod", Kod)
				Log("basvuru", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub Onayla(ByVal Personel As Integer, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				ExecSQL("update basvuru set durum = '1' where durum = '0' and personel = @personel", Personel)
				Dim Kod = OpenSQL("select @@identity")(0)
				Log("basvuru", Personel, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub Reddet(ByVal Personel As Integer, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				ExecSQL("update basvuru set durum = '9' where durum = '0' and personel = @personel", Personel)
				Dim Kod = OpenSQL("select @@identity")(0)
				Log("basvuru", Personel, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub Isle(ByVal Personel As Integer, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				ExecSQL("update basvuru set durum = '2' where durum = '1' and personel = @personel", Personel)
				ExecSQL("insert into hareket (personel,tur,tarih1,tarih2) select personel,'I',tarih1,tarih2 from basvuru where personel = @personel and durum = '2'", Personel)
				Dim Kod = OpenSQL("select @@identity")(0)
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

	End Class

	Class Izin

		Shared Function Hesapla(ByVal Kod As Integer) As List(Of IzinBilgisi)
			Dim List As New List(Of IzinBilgisi)
			Dim Cinsiyet As String = OpenSQL("select cinsiyet from personel where kod = @personel", Kod)(0)
			Dim Rs = OpenSQL("select * from hareket where personel = @personel order by tarih1", Kod)
			Dim Hareketler As New List(Of Hareket)
			Do Until Rs.EOF
				Hareketler.Add(HareketOlustur(Rs))
				Rs.MoveNext()
			Loop
			Rs = OpenSQL("select * from basvuru where personel = @personel and durum in ('0','1') order by tarih1", Kod)
			Do Until Rs.EOF
				Hareketler.Add(New HareketYillikIzin With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .Draft = True})
				Rs.MoveNext()
			Loop
			If Not (From h In Hareketler Where TypeOf h Is HareketIlk).Any Then Return List
			Dim MaxDate = (From h In Hareketler Select h.Tarih2).Max
			If Today.Year > MaxDate.Year Then MaxDate = New Date(Today.Year, 1, 1)
			For y = Hareketler(0).Tarih.Year To MaxDate.Year
				If y <> Hareketler.First.Tarih.Year Then Hareketler.Add(New HareketYilbasi With {.Tarih = y & "/01/01"})
				If y < MaxDate.Year Then Hareketler.Add(New HareketYilsonu With {.Tarih = y & "/12/31"})
			Next
			If Today.Date > MaxDate Then Hareketler.Add(New HareketBugun With {.Tarih = Today.Date})
			For Each Hareket In Hareketler.ToList
				If TypeOf Hareket Is HareketYillikIzin AndAlso Hareket.Tarih1.Year + 1 = Hareket.Tarih2.Year Then
					'Yıl dönümü olduğu için ikiye bölünmesi gerek
					Dim DusulmesiGerekenGun = GunHesapla(Hareket.Tarih1, Hareket.Tarih2)
					Dim DegerlendirilecekTatil = GunHesapla(Hareket.Tarih1, Hareket.Tarih2, True)
					Dim YeniHareket = New HareketYillikIzin With {.Kod = Hareket.Kod}
					YeniHareket.Tarih2 = Hareket.Tarih2
					YeniHareket.Tarih1 = YeniHareket.Tarih2.AddDays(-YeniHareket.Tarih2.Day + 1)
					YeniHareket.Tarih = YeniHareket.Tarih1
					Hareket.Tarih2 = YeniHareket.Tarih1.AddDays(-1)
					Hareketler.Add(YeniHareket)
					If DegerlendirilecekTatil > 0 Then
						'Tatil gününü içeren, 2 veya 3 gün izin kullanılmış.
						Do Until Not Tatil(Hareket.Tarih2)
							Hareket.Tarih2 = Hareket.Tarih2.AddDays(-1)
						Loop
						Do Until Not Tatil(YeniHareket.Tarih1)
							YeniHareket.Tarih1 = YeniHareket.Tarih1.AddDays(1)
							YeniHareket.Tarih = YeniHareket.Tarih1
						Loop
					End If
				End If
			Next
			If Today.Month = 12 And Hareketler.Last.Tarih.Year = Today.Year Then Hareketler.Add(New HareketYilsonu With {.Tarih = Today.Year & "/12/31"})
			Hareketler.Sort()
			Dim Info As New IzinBilgisi
			For Each Hareket As Hareket In (From h In Hareketler Where h.Gunluk)
				Info = Hareket.Calculate(Info, Cinsiyet)
				List.Add(Info)
			Next
			Return List
		End Function

		Shared Function Oku(ByVal Kod As Integer) As Hareket
			Return HareketOlustur(OpenSQL("select * from hareket where kod = @kod", Kod))
		End Function

		Shared Sub Sil(ByVal Kod As Integer, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				ExecSQL("delete from hareket where kod = @kod", Kod)
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Silme işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Function Liste(ByVal Kod As Integer, ByVal Yil As Integer) As List(Of Hareket)
			Dim Hareketler As New List(Of Hareket)
			Dim Rs = OpenSQL("select * from hareket where personel = @personel and year(tarih1) = @yil order by tarih1", Kod, Yil)
			Do Until Rs.EOF
				Hareketler.Add(HareketOlustur(Rs))
				Rs.MoveNext()
			Loop
			Return Hareketler
		End Function

		Shared Sub YillikKaydet(ByVal Kod As Integer, ByVal Personel As Integer, ByVal Tarih1 As Date, ByVal Tarih2 As Date, ByVal EvrakNo As String, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				If Kod = 0 Then
					ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,evrakno) values (@personel,@tur,@tarih1,@tarih2,@evrakno)", Personel, "I", Tarih1, Tarih2, EvrakNo)
					Kod = OpenSQL("select @@identity")(0)
				Else
					ExecSQL("update hareket set tarih1 = @tarih1, tarih2 = @tarih2, evrakno = @evrakno where kod = @kod", Tarih1, Tarih2, EvrakNo, Kod)
				End If
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub HastalikKaydet(ByVal Kod As Integer, ByVal Personel As Integer, ByVal Tarih1 As Date, ByVal Tarih2 As Date, ByVal EvrakNo As String, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				If Kod = 0 Then
					ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,evrakno) values (@personel,@tur,@tarih1,@tarih2,@evrakno)", Personel, "H", Tarih1, Tarih2, EvrakNo)
					Kod = OpenSQL("select @@identity")(0)
				Else
					ExecSQL("update hareket set tarih1 = @tarih1, tarih2 = @tarih2, evrakno = @evrakno where kod = @kod", Tarih1, Tarih2, EvrakNo, Kod)
				End If
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub MazaretKaydet(ByVal Kod As Integer, ByVal Personel As Integer, ByVal Tarih1 As Date, ByVal Tarih2 As Date, ByVal EvrakNo As String, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				If Kod = 0 Then
					ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,evrakno) values (@personel,@tur,@tarih1,@tarih2,@evrakno)", Personel, "M", Tarih1, Tarih2, EvrakNo)
					Kod = OpenSQL("select @@identity")(0)
				Else
					ExecSQL("update hareket set tarih1 = @tarih1, tarih2 = @tarih2, evrakno = @evrakno where kod = @kod", Tarih1, Tarih2, EvrakNo, Kod)
				End If
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub OzelMazaretKaydet(ByVal Kod As Integer, ByVal Personel As Integer, ByVal Tarih1 As Date, ByVal Tarih2 As Date, ByVal EvrakNo As String, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				If Kod = 0 Then
					ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,evrakno) values (@personel,@tur,@tarih1,@tarih2,@evrakno)", Personel, "O", Tarih1, Tarih2, EvrakNo)
					Kod = OpenSQL("select @@identity")(0)
				Else
					ExecSQL("update hareket set tarih1 = @tarih1, tarih2 = @tarih2, evrakno = @evrakno where kod = @kod", Tarih1, Tarih2, EvrakNo, Kod)
				End If
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub SaatlikKaydet(ByVal Personel As Integer, ByVal Tarih As Date, ByVal Saat1 As String, ByVal Saat2 As String, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				ExecSQL("insert into hareket (personel,tur,tarih1,tarih2,saat1,saat2,saat) values (@personel,@tur,@tarih1,@tarih2,@saat1,@saat2,@saat)", Personel, "S", Tarih, Tarih, Saat1.Replace(":", ""), Saat2.Replace(":", ""), SaatHesapla(Saat1, Saat2))
				Dim Kod = OpenSQL("select @@identity")(0)
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Sub SaatlikTopluKaydet(ByVal Kod As Integer, ByVal Personel As Integer, ByVal Tarih As Date, ByVal Gun As Integer, ByVal SaatBakiyesi As Decimal, ByVal EvrakNo As String, ByVal Kullanici As Integer)
			Try
				ExecSQL("begin tran")
				If Kod = 0 Then
					ExecSQL("insert into hareket (personel,tur,tarih1,gun,saat,evrakno) values (@personel,@tur,@tarih,@gun,@saat,@evrakno)", Personel, "P", Tarih, Gun, SaatBakiyesi, EvrakNo)
					Kod = OpenSQL("select @@identity")(0)
					ExecSQL("update hareket set evrakno = @evrakno where tur = 'S' and personel = @personel and evrakno is null", Kod, Personel)
				Else
					ExecSQL("update hareket set tarih1 = @tarih, gun = @gun, evrakno = @evrakno where kod = @kod", Tarih, Gun, EvrakNo, Kod)
				End If
				Log("hareket", Kod, Kullanici)
				ExecSQL("commit tran")
			Catch ex As Exception
				ExecSQL("rollback tran")
				Warning("Kayıt işlemi sırasında bir hata oluştu: " & ex.Message)
			End Try
		End Sub

		Shared Function SaatlikListe(ByVal Personel As Integer) As List(Of HareketSaatlikIzin)
			Dim Hareketler As New List(Of HareketSaatlikIzin)
			Q("select * from hareket where tur = 'P' and personel = @personel order by tarih1 desc")
			Dim Rs = OpenSQL("*", Personel)
			Dim SonTarih As Date = "1950/01/01"
			Dim Bakiye As Decimal = 0
			If Not Rs.EOF Then
				SonTarih = Rs("tarih1")
				Bakiye = IsNull(Rs("saat"), 0)
			Else
				Q("select * from hareket where tur = '*' and personel = @personel")
				Rs = OpenSQL("*", Personel)
				If Not Rs.EOF Then Bakiye = Rs("saat")
			End If
			Q("select * from hareket where personel = @personel and tur = 'S' and isnull(evrakno,0) = 0")
			Rs = OpenSQL("*", Personel)
			Hareketler.Add(New HareketSaatlikIzin With {.Tarih = SonTarih, .SaatBakiyesi = Bakiye})
			Do Until Rs.EOF
				Hareketler.Add(New HareketSaatlikIzin With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Saat1 = Rs("saat1"), .Saat2 = Rs("saat2")})
				Rs.MoveNext()
			Loop
			Return Hareketler
		End Function

	End Class

	Class Sorunlu

		Shared Function Birim(ByVal kod As Integer) As List(Of Integer)
			Q("select a.personel as per1, b.personel as per2")
			Q("from hareket a inner join hareket b on a.personel = b.personel and a.kod < b.kod inner join personel p on a.personel = p.kod")
			Q("where @dpt in (0, p.birim) and a.tur in ('I','H','M') and b.tur in ('I','H','M')")
			Q("and ((a.tarih1 between b.tarih1 and b.tarih2) or (a.tarih2 between b.tarih1 and b.tarih2)")
			Q("or (b.tarih1 between a.tarih1 and a.tarih2) or (b.tarih2 between a.tarih1 and a.tarih2))")
			Dim Rs = OpenSQL("*", kod)
			Dim List As New List(Of Integer)
			Do Until Rs.EOF
				If Not List.Contains(Rs("per1")) Then List.Add(Rs("per1"))
				If Not List.Contains(Rs("per2")) Then List.Add(Rs("per2"))
				Rs.MoveNext()
			Loop
			Return List
		End Function

		Shared Function Personel(ByVal kod As Integer) As List(Of Integer)
			Q("select a.kod as hrk1, b.kod as hrk2")
			Q("from hareket a inner join hareket b on a.personel = b.personel and a.kod < b.kod")
			Q("where a.personel = @personel and a.tur in ('I','H','M') and b.tur in ('I','H','M')")
			Q("and ((a.tarih1 between b.tarih1 and b.tarih2) or (a.tarih2 between b.tarih1 and b.tarih2)")
			Q("or (b.tarih1 between a.tarih1 and a.tarih2) or (b.tarih2 between a.tarih1 and a.tarih2))")
			Dim Rs = OpenSQL("*", kod)
			Dim List As New List(Of Integer)
			Do Until Rs.EOF
				If Not List.Contains(Rs("hrk1")) Then List.Add(Rs("hrk1"))
				If Not List.Contains(Rs("hrk2")) Then List.Add(Rs("hrk2"))
				Rs.MoveNext()
			Loop
			Return List
		End Function

	End Class

	Private Shared Function HareketOlustur(ByVal Rs As Recordset) As Hareket
		Select Case Rs("tur")
			Case "*" : Return New HareketIlk With {.Tarih = Rs("tarih1"), .IlkStatu = Rs("statu"), .IlkIzin = Rs("izin"), .IlkBakiye = Rs("gun"), .SaatBakiyesi = Rs("saat")}
			Case "I" : Return New HareketYillikIzin With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .EvrakNo = IsNull(Rs("evrakno"), "")}
			Case "H" : Return New HareketHastalikIzni With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .EvrakNo = IsNull(Rs("evrakno"), "")}
			Case "M" : Return New HareketMazaretIzni With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .EvrakNo = IsNull(Rs("evrakno"), "")}
			Case "O" : Return New HareketOzelMazaretIzni With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Tarih1 = Rs("tarih1"), .Tarih2 = Rs("tarih2"), .EvrakNo = IsNull(Rs("evrakno"), "")}
			Case "T" : Return New HareketStatu With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .YeniStatu = Rs("statu")}
			Case "S" : Return New HareketSaatlikIzin With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Saat1 = Rs("saat1"), .Saat2 = Rs("saat2")}
			Case "P" : Return New HareketSaatlikToplamIzin With {.Kod = Rs("kod"), .Tarih = Rs("tarih1"), .Gun = Rs("gun"), .SaatBakiyesi = IsNull(Rs("saat"), 0), .EvrakNo = IsNull(Rs("evrakno"), "")}
		End Select
		Return Nothing
	End Function

	Class Rapor

		Shared Function AyaGoreIzinliPersonel(birim As Integer, ay As String) As Recordset
			Q("select a.adi,a.soyadi,b.tarih1,b.tarih2")
			Q("from personel a inner join hareket b on a.kod = b.personel")
			Q("where a.birim = :birim and b.tur = 'I' and b.tarih2 >= :d1 and b.tarih1 <= :d2")
			Q("order by 1,2,3")
			Dim Tarih1 = New Date(Mid(ay, 1, 4), Mid(ay, 6, 2), 1)
			Dim Tarih2 = Tarih1.LastDayOfMonth
			Return OpenSQL("*", birim, Tarih1, Tarih2)
		End Function

	End Class

End Class

Public Module WebExtensions

	Function StatuListesi() As SortedList(Of String, Statu)
		Static List As New SortedList(Of String, Statu)
		If List.Count = 0 Then
			List.Add("", New Statu("", "", 0, 0, 0, 0))
			List.Add("AD", New Statu("AD", "Aday", 2.5, 42, 10, 15))
			List.Add("KD", New Statu("KD", "Kadrolu", 3.5, 42, 10, 15))
			List.Add("IS", New Statu("IS", "İşçi", 3.5, 42, 10, 15))
			List.Add("GC", New Statu("GC", "Geçici", 3.5, 42, 10, 15))
			List.Add("IP", New Statu("IP", "İPGM", 0, 42, 10, 15))
			List.Add("G1", New Statu("G1", "Geçici 1", 1, 42, 10, 15))
			List.Add("G2", New Statu("G2", "Geçici 2", 2.5, 42, 10, 15))
			List.Add("HY", New Statu("HY", "KTHY", 2.5, 15, 3, 3))
		End If
		Return List
	End Function

	Function GunHesapla(ByVal Tarih1 As Date, ByVal Tarih2 As Date, Optional ByVal OnlyHolidays As Boolean = False) As Integer
		Dim Count(1) As Integer
		Tarih1 = Tarih1.Date
		Tarih2 = Tarih2.Date
		Dim BaslangicBitisTatil = Tarih1.Tatil Or Tarih2.Tatil
		Do Until Tarih1 > Tarih2
			Count(If(Tarih1.Tatil, 0, 1)) += 1
			Tarih1 = Tarih1.AddDays(1)
		Loop
		If OnlyHolidays Then
			Return If(Count(1) > 3 Or BaslangicBitisTatil, 0, Count(0))
		End If
		If Count(1) > 3 Or BaslangicBitisTatil Then Count(1) += Count(0)
		Return Count(1)
	End Function

	<Extension()> _
	Public Function DMY2(ByVal d As Date) As String
		Return d.ToString("dd/MM/yy")
	End Function

	<Extension()> _
	Function FirstDayOfMonth(ByVal d As Date) As Date
		Return d.AddDays(-d.Day + 1)
	End Function

	<Extension()> _
	Function LastDayOfMonth(ByVal d As Date) As Date
		Return d.FirstDayOfMonth.AddMonths(1).AddDays(-1)
	End Function

	<Extension()> _
	Public Function YMD(ByVal d As Date) As String
		Return d.ToString("yyyyMMdd")
	End Function

	<Extension()> _
	Public Function DateStr(ByVal d As Date) As String
		Return d.ToString("yyyy/MM/dd")
	End Function

	<Extension()> _
	Public Function DMY(ByVal d As Date) As String
		Return d.ToString("dd/MM/yyyy")
	End Function

	Function IsNull(ByVal Obj As Object, Optional ByVal Value As String = "") As Object
		If Obj Is Nothing Then Return Value
		If IsDBNull(Obj) Then Return Value
		Return Obj
	End Function

End Module

